package com.tangguo.vshop.web;
import javax.servlet.http.HttpServletRequest;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.ResponseEntity;
import org.springframework.security.core.AuthenticationException;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import com.tangguo.vshop.domain.User;
import com.tangguo.vshop.security.JwtAuthenticationRequest;
import com.tangguo.vshop.security.JwtAuthenticationResponse;
import com.tangguo.vshop.service.AuthService;


@RestController
public class AuthController {
	@Value("${jwt.header}")
	private String tokenHeader;
	@Autowired
	private AuthService authService;
	@RequestMapping(value = "${jwt.route.authentication.path}", method = RequestMethod.POST)
	public ResponseEntity<?> createAuthenticationToken(
			@RequestBody JwtAuthenticationRequest authenticationRequest) throws AuthenticationException{
		final String token = authService.login(authenticationRequest.getUsername(), authenticationRequest.getPassword());

		// Return the token
		return ResponseEntity.ok(new JwtAuthenticationResponse(token));
	}
	@RequestMapping(value = "${jwt.route.authentication.refresh}", method = RequestMethod.GET)
	public ResponseEntity<?> refreshAndGetAuthenticationToken(
			HttpServletRequest request) throws AuthenticationException{
		String token = request.getHeader(tokenHeader);
		String refreshedToken = authService.refresh(token);
		if(refreshedToken == null) {
			return ResponseEntity.badRequest().body(null);
		} else {
			return ResponseEntity.ok(new JwtAuthenticationResponse(refreshedToken));
		}
	}
	@RequestMapping(value = "${jwt.route.authentication.register}", method = RequestMethod.POST)
	public User register(@RequestBody User addedUser) throws AuthenticationException{
		return authService.register(addedUser);
	}
}